package anthology.others;

//https://blog.csdn.net/qq_39657597/article/details/83687955
//数字转为汉字表述，最大单位为兆，如-10023456转为负一千零二万三千四百五十六
public class 整数转换汉字 {
    private static final String[] CHINESE_DIGITS = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    private static final String[] UNITS_GROUP = {"", "万", "亿", "兆"};

    public static String numberToChinese(long num) {
        if (num == 0) return "零";

        boolean isNegative = num < 0;
        if (isNegative) num = -num;

        StringBuilder result = new StringBuilder();
        int unitPos = 0; // 用于追踪当前处理的是哪个单位组（个、万、亿、兆）

        while (num > 0) {
            long currentGroup = num % 10000; // 取出当前的四位数
            if (currentGroup != 0 || (result.length() > 0 && !result.toString().endsWith(CHINESE_DIGITS[0]))) {
                // 如果当前四位数不是0或者结果字符串中最后一个字符不是"零"，则添加当前四位数的汉字表示
                result.insert(0, convertGroup(currentGroup));
                if (unitPos > 0) {
                    result.insert(0, UNITS_GROUP[unitPos]);
                }
            }

            num /= 10000; // 移动到下一个四位数
            unitPos++;
        }

        // 去掉最后的"零"如果有的话
        if (result.toString().startsWith("零")) {
            result.deleteCharAt(0);
        }

        // 如果是负数，在前面加上"负"
        if (isNegative) {
            result.insert(0, "负");
        }

        return result.toString();
    }

    private static String convertGroup(long group) {
        StringBuilder groupResult = new StringBuilder();

        // 千位
        if (group >= 1000) {
            groupResult.append(CHINESE_DIGITS[(int)(group / 1000)]);
            groupResult.append("千");
            group %= 1000;
        }

        // 百位
        if (group >= 100) {
            groupResult.append(CHINESE_DIGITS[(int)(group / 100)]);
            groupResult.append("百");
            group %= 100;
        }

        // 十位
        if (group >= 10) {
            if (group == 10) { // 特殊情况：十
                groupResult.append("十");
            } else {
                groupResult.append(CHINESE_DIGITS[(int)(group / 10)]);
                groupResult.append("十");
            }
            group %= 10;
        }

        // 个位
        if (group > 0 || (group == 0 && groupResult.length() == 0)) {
            groupResult.append(CHINESE_DIGITS[(int)group]);
        } else if (group == 0 && groupResult.length() > 0) {
            groupResult.append(CHINESE_DIGITS[0]); // 添加"零"以避免连续的单位
        }

        return groupResult.toString();
    }

    public static void main(String[] args) {
        System.out.println(numberToChinese(-10023456)); // 输出: 负一千零二万三千四百五十六
        System.out.println(numberToChinese(123456789012L)); // 输出: 一千二百三十四亿五千六百七十八万九千零一十二
    }
}
